/*
 * BibliotecaTrabajo.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 15/03/2011, 06:00:05 PM
 */

package com.ufps.cuatro.modelo.biblioteca;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.asistente.clase.compleja.TipoGeneracionClaseCompleja;
import com.ufps.cuatro.modelo.codificacion.PaqueteClass;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorEspejo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorLibre;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorClaseCompleja;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorEnum;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoGetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoSetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorString;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorVinculador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegrador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorSimple;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorModeloAsociado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGenerado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoInterno;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoSimple;
import com.ufps.cuatro.util.base.ObjectBase;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;

/**
 * <i><b>BibliotecaTrabajo:</b></i><p>Esta Clase encapsula los Componentes Generados
 * en el Trabajo Actual y otros objeto que mantiene las Configuraciones asociadas.</p>  
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 15/03/2011
 * @see ObjectBase 
 */
public class BibliotecaTrabajo extends ObjectBase{
    private static final long serialVersionUID = 4340642838537326476L;   
    
    /**
     * Representa la Exclusión del Componente.
     */
    public static final int EXCLUSION_C        = 0;
    /**
     * Representa la Exclusión del Componente Generado.
     */
    public static final int EXCLUSION_CG       = 1;
    /**
     * Representa la Exclusión del Componente Generado Interno.
     */
    public static final int EXCLUSION_CGI      = 2;
    /**
     * Representa la Exclusión del Componente Generado Simple.
     */
    public static final int EXCLUSION_CGS      = 3;
    /**
     * Representa la Exclusión del Componente Distribuidor.
     */
    public static final int EXCLUSION_CD       = 4;
    /**
     * Representa la Exclusión del Componente Distribuidor Extra.
     * @deprecated Se ha implementado una representación por tipos de datos.
     */
    public static final int EXCLUSION_CDE      = 5;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador.
     */
    public static final int EXCLUSION_CDG      = 6;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Unitario.
     */
    public static final int EXCLUSION_CDGU     = 7;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Enum.
     */
    public static final int EXCLUSION_CDGE     = 8;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Método.
     */
    public static final int EXCLUSION_CDGM     = 9;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Método Setter.
     */
    public static final int EXCLUSION_CDGMS    = 10;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Metodo Getter.
     */
    public static final int EXCLUSION_CDGMG    = 11;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador Clase.
     */
    public static final int EXCLUSION_CDGC     = 12;
    /**
     * Representa la Exclusión del Componente Distribuidor Integrador.
     */
    public static final int EXCLUSION_CDI      = 13;
    /**
     * Representa la Exclusión del Componente Distribuidor Integrador Extra.
     * @deprecated Se ha implementado una representación por tipos de datos.
     */
    public static final int EXCLUSION_CDIE     = 14;
    /**
     * Representa la Exclusión del Componente Distribuidor Integrador Generador.
     */
    public static final int EXCLUSION_CDIG     = 15;
    /**
     * Representa la Exclusión del Componente Distribuidor Integrador Generador Método.
     */
    public static final int EXCLUSION_CDIGM    = 16;
    /**
     * Representa la Exclusión del Componente Distribuidor Integrador Generador Simple.
     */
    public static final int EXCLUSION_CDIGS    = 17;    
    /**
     * Representa la Exclusión del Componente Distribuidor Contenedor.
     */
    public static final int EXCLUSION_CDC      = 18;
    /**
     * Representa la Exclusión del Componente Distribuidor Contenedor por Asistente Espejo.
     */
    public static final int EXCLUSION_CDCAE    = 19;
    /**
     * Representa la Exclusión del Componente Distribuidor Contenedor por Asistente Libre.
     */
    public static final int EXCLUSION_CDCAL    = 20;
    /**
     * Representa la Exclusión del Componente Distribuidor Generador L.
     */
    public static final int EXCLUSION_CDGL     = 21;
    
    private PaqueteClass objPaqueteRoot;
    private ArrayList<ComponenteDistribuidorContenedor> objComponentesContenedores;
    private ArrayList<ComponenteDistribuidorIntegrador> objComponentesIntegradores;
    private ArrayList<ComponenteDistribuidorGenerador> objComponentesGeneradores;
    private ArrayList<ComponenteDistribuidorExtra> objComponentesExtras;
    private ArrayList<ComponenteGeneradoSimple> objComponentesGenerados;  
    private ArrayList<ComponenteBeans> objComponentesBeans;    
    private TipoBiblioteca eBiblioteca = TipoBiblioteca.eSinAsignar;
    private HashMap<String, StaticListModelObject> objStaticListModelString;
    private ArrayList<String> objNotificacionesModeloAnalizado;    
    private boolean listaEspera = false;

    /**
     * Constructuor por Defecto.
     * @param eBiblioteca Define el Tipo de <code>BibliotecaTrabajo</code>.
     * @see TipoBiblioteca 
     */
    public BibliotecaTrabajo(TipoBiblioteca eBiblioteca) {
        super();
        this.eBiblioteca = eBiblioteca;
        this.reiniciar();    
    }

    /**
     * Reinicia las Referecnias de la Biblioteca de Trabajo.
     */
    public final void reiniciar() {
        this.objPaqueteRoot = UtilRepresentacion.objPaqueteRoot;
        this.objComponentesContenedores     = new ArrayList<ComponenteDistribuidorContenedor>();
        this.objComponentesIntegradores     = new ArrayList<ComponenteDistribuidorIntegrador>();
        this.objComponentesGeneradores      = new ArrayList<ComponenteDistribuidorGenerador>();
        this.objComponentesExtras           = new ArrayList<ComponenteDistribuidorExtra>();        
        this.objComponentesGenerados        = new ArrayList<ComponenteGeneradoSimple>();        
        this.objComponentesBeans            = new ArrayList<ComponenteBeans>();
        this.objStaticListModelString       = new HashMap<String, StaticListModelObject>();
        this.objNotificacionesModeloAnalizado = new ArrayList<String>();
        this.updateIdSerialComponentes();
    }
    
    /**
     * Agrega un <code>ComponenteBeans</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteBeans</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteBeans obj){
        try{
            obj.idColeccion = objComponentesBeans.size();
            return this.objComponentesBeans.add(obj);
        }catch(java.lang.NullPointerException ex){}
        return false;
    }

    /**
     * Agrega un <code>ComponenteDistribuidorContenedor</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteDistribuidorContenedor</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteDistribuidorContenedor obj){
        try{
            if(obj != null){
                if(!this.contieneComponente(obj)){
                    obj.idColeccion = objComponentesContenedores.size();
                    return this.objComponentesContenedores.add(obj);
                }
            }            
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Agrega un <code>ComponenteDistribuidorIntegrador</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteDistribuidorIntegrador</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteDistribuidorIntegrador obj){
       try{
           if(obj != null){
                if(!this.contieneComponente(obj)){
                    obj.idColeccion = objComponentesIntegradores.size();                
                    return this.objComponentesIntegradores.add(obj);
                }
           }
        }catch(java.lang.NullPointerException ex){}
       return  false;
    }
   
    /**
     * Agrega un <code>ComponenteDistribuidorGenerador</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteDistribuidorGenerador</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteDistribuidorGenerador obj){        
        try{
            if(obj != null){
                if(!this.contieneComponente(obj)){
                    obj.idColeccion = objComponentesGeneradores.size();
                    boolean add = this.objComponentesGeneradores.add(obj);
                    if(add){//Solo si se ingresa un Componente
                        if(obj instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                            verificarListaEspera((ComponenteDistribuidorGeneradorClaseCompleja)obj);
                            if(listaEspera){//Verificar si puede atender la espera
                                launchDaemonEspera((ComponenteDistribuidorGeneradorClaseCompleja) obj);
                            }
                        }
                    }
                    return add;
                }
            }
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    private void verificarListaEspera(ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase){
        if(objComponenteDistribuidorGeneradorClase.isExisteListaEspera() && !listaEspera){
            listaEspera = true;
        }
    }
    
    private void launchDaemonEspera(ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClase){
        //Se recorre la coleccion de generadores
        for(ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador : this.objComponentesGeneradores){
            //Se evlauan solo los generadores clases ya que solo ellos pueden tener propiedades y estas
            //en un instante tal vez no se puedan satisfacer
            if(objComponenteDistribuidorGenerador instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClaseInterno = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteDistribuidorGenerador;
                //Se evalua si el elemento iterado tiene lista de espera
                if(objComponenteDistribuidorGeneradorClaseInterno.isExisteListaEspera()){
                    String strClassPath = objComponenteDistribuidorGeneradorClase.getStrClassPathTipoDato();
                    //se evalua si el elemento iterado tiene en su lista de espera una solicitud del tipo de datos del parametro recibido
                    if(objComponenteDistribuidorGeneradorClaseInterno.isExisteEnListaEspera(strClassPath)){
                        //Se obtiene el metodo
                        ObjetoReflexion objReflexion = objComponenteDistribuidorGeneradorClaseInterno.devolverMetodoEnListaDeEspera(strClassPath);
                        //Evaluar el Tipo set/get
                        if(objReflexion.getObj() instanceof Method){
                            Method objMetodo = (Method) objReflexion.getObj();
                            //Se crea un componente generico
                            ComponenteDistribuidorGeneradorMetodo objComponenteGeneradorMetodo = GeneradorComponentes.objPatronRepresentacionBase.getContenedorMetodo(objMetodo);
                            //se evalua que haya sido creado correctamente
                            if(objComponenteGeneradorMetodo != null){
                                //se inicializa 
                                objComponenteGeneradorMetodo = GeneradorComponentes.construirComponenteGeneradorMetodo(objComponenteGeneradorMetodo, objReflexion, true);
                                if(objComponenteGeneradorMetodo != null){
                                    //Se configura el Componente Individualmente con su contenido
                                    objComponenteGeneradorMetodo.cargarPlantillasDesdeArchivoProperties(null);
                                    GeneradorComponentes.initDistribucion(objComponenteGeneradorMetodo);
                                    objComponenteGeneradorMetodo.setObjComponenteParent(objComponenteDistribuidorGeneradorClaseInterno);
                                    objComponenteGeneradorMetodo.idColeccion = objComponenteDistribuidorGeneradorClaseInterno.getObjComponentes().size();
                                    objComponenteDistribuidorGeneradorClaseInterno.addComponente(objComponenteGeneradorMetodo);
                                    //Se configura y reestaura el parent contenedor                                    
                                    objComponenteDistribuidorGeneradorClaseInterno.clearAll();
                                    objComponenteDistribuidorGeneradorClaseInterno.cargarPlantillasDesdeArchivoProperties(null);                                    
                                    GeneradorComponentes.initDistribucion(objComponenteDistribuidorGeneradorClaseInterno);
                                    objComponenteDistribuidorGeneradorClaseInterno.eliminarEspera(strClassPath);
                                    String strMsg = "Representación: " + objMetodo.toGenericString() + " agregada para el Componente: " + objComponenteDistribuidorGeneradorClaseInterno.getName();
                                    UtilRender.printlnConsole(strMsg, 0, true);
                                }
                            }
                        }
                    }                    
                }
            }
        }                
    }
    
    /**
     * Agrega un <code>ComponenteDistribuidorExtra</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteDistribuidorExtra</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteDistribuidorExtra obj){
        try{
            obj.idColeccion = objComponentesExtras.size();
            return this.objComponentesExtras.add(obj);
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Agrega un <code>ComponenteGeneradoSimple</code> a la <code>BibliotecaTrabajo</code>.
     * @param obj <code>ComponenteGeneradoSimple</code> que se agregará a la <code>BibliotecaTrabajo</code>.
     * @return boolean resultado del proceso.
     */
    public boolean add(ComponenteGeneradoSimple obj){
        try{
            obj.idColeccion = objComponentesGenerados.size();
            return this.objComponentesGenerados.add(obj);
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Devuelve la Colección de <code>ComponenteBeans</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteBeans</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteBeans> getObjComponentesBeans() {
       try{
        return objComponentesBeans;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     * Devuelve la Colección de <code>ComponenteDistribuidorContenedor</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteDistribuidorContenedor</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteDistribuidorContenedor> getObjComponentesContenedores() {
       try{ 
            UtilRepresentacion.sort(objComponentesContenedores);
            return objComponentesContenedores;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }
    
    /**
     * Devuelve la Colección de <code>ComponenteDistribuidorIntegrador</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteDistribuidorIntegrador</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteDistribuidorIntegrador> getObjComponentesIntegradores() {
       try{
            UtilRepresentacion.sort(objComponentesIntegradores);
            return objComponentesIntegradores;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     * Devuelve la Colección de <code>ComponenteDistribuidorExtra</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteDistribuidorExtra</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteDistribuidorExtra> getObjComponentesExtras() {
       try{
            UtilRepresentacion.sort(objComponentesExtras);
            return objComponentesExtras;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     * Devuelve la Colección de <code>ComponenteDistribuidorGenerador</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteDistribuidorGenerador</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteDistribuidorGenerador> getObjComponentesGeneradores() {
        try{
            UtilRepresentacion.sort(objComponentesGeneradores);
            return objComponentesGeneradores;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }   

    /**
     * Devuelve la Colección de <code>ComponenteGeneradoSimple</code> agregados a la <code>BibliotecaTrabajo</code>.
     * @return Colección de <code>ComponenteGeneradoSimple</code> agregados a la <code>BibliotecaTrabajo</code>.
     */
    public ArrayList<ComponenteGeneradoSimple> getObjComponentesGenerados() {
        try{
            UtilRepresentacion.sort(objComponentesGenerados);
            return objComponentesGenerados;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }   
    
    /**
     * Indica si la <code>BibliotecaTrabajo</code> tiene <code>Componente</code>s Agregados.
     * @return boolean que indica el resultado del proceso.
     */
    public boolean isEmpty(){        
        try{
        return this.objComponentesContenedores.isEmpty() &&
                this.objComponentesIntegradores.isEmpty() &&
                this.objComponentesGeneradores.isEmpty() &&
                this.objComponentesExtras.isEmpty() &&                
                this.objComponentesGenerados.isEmpty();
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Indica si es posible generar el proyecto por inclusion de representaciones.
     * @return boolean que indica el resultado del proceso.
     */
    public boolean canGenerate(){
        return isIncludedComponenteContenedor() ||
                isIncludedComponenteIntegrador() ||
                isIncludedComponenteGenerador();
    }
    
    /**
     * Indica si existe una representación incluida para generar el proyecto.
     * @return boolean que indica el resultado del proceso.
     */
    public boolean isIncludedComponenteContenedor(){
        if(this.objComponentesContenedores.isEmpty()){
            return false;
        }
        for(ComponenteDistribuidor objComponente : this.objComponentesContenedores){
            if(objComponente.isIncluido()){
                return true;
            }
        }
        return false;
    }
    
    /**
     * Indica si existe una representación incluida para generar el proyecto.
     * @return boolean que indica el resultado del proceso.
     */
    public boolean isIncludedComponenteIntegrador(){
        if(this.objComponentesIntegradores.isEmpty()){
            return false;
        }
        for(ComponenteDistribuidor objComponente : this.objComponentesIntegradores){
            if(objComponente.isIncluido()){
                return true;
            }
        }
        return false;
    }
    
    /**
     * Indica si existe una representación incluida para generar el proyecto.
     * @return boolean que indica el resultado del proceso.
     */
    public boolean isIncludedComponenteGenerador(){
        if(this.objComponentesGeneradores.isEmpty()){
            return false;
        }
        for(ComponenteDistribuidor objComponente : this.objComponentesGeneradores){
            if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                if(objComponente.isIncluido()){
                    return true;
                }
            }
        }
        return false;
    }
    
    public boolean isIncludedInRepresentation(ComponenteDistribuidorIntegrador objComponenteDistribuidor){
        for(ComponenteDistribuidorContenedor objComponenteParent : this.objComponentesContenedores){
            for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                    return true;
                }
            }
        }
        return false;
    }
    
    public boolean isIncludedInRepresentation(ComponenteDistribuidorGenerador objComponenteDistribuidor){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            for(ComponenteDistribuidorIntegrador objComponenteParent : this.objComponentesIntegradores){
                for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                    if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                        return true;
                    }
                }
            }
        }
        else{
            for(ComponenteDistribuidorIntegrador objComponenteParent : this.objComponentesIntegradores){
                for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                    if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                        return true;
                    }
                }
            }
            for(ComponenteDistribuidorGenerador objComponenteParent : this.objComponentesGeneradores){
                if(objComponenteParent instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                        if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }
    
    public boolean isIncludedIntoRepresentation(ComponenteDistribuidorGenerador objComponenteDistribuidor){
        return !canExcludeInRepresentation(objComponenteDistribuidor);
    }
    
    public boolean canExcludeInRepresentation(ComponenteDistribuidorGenerador objComponenteDistribuidor){
        if(objComponenteDistribuidor instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            for(ComponenteDistribuidorIntegrador objComponenteParent : this.objComponentesIntegradores){
                if(objComponenteParent instanceof ComponenteDistribuidorIntegradorMetodo){
                    for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                        if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                            return false;
                        }
                    }
                }
            }
        }
        else{
            for(ComponenteDistribuidorIntegrador objComponenteParent : this.objComponentesIntegradores){
                if(objComponenteParent instanceof ComponenteDistribuidorIntegradorMetodo){
                    for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                        if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                            return false;
                        }
                    }
                }
            }
            for(ComponenteDistribuidorGenerador objComponenteParent : this.objComponentesGeneradores){
                if(objComponenteParent instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                    for(Componente objComponenteIncluido : objComponenteParent.getComponentesDistribuidos()){
                        if(objComponenteDistribuidor.equals(objComponenteIncluido)){
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }
    
    /**
     * 
     * @param objComponenteDistribuidorModeloAsociado
     * @param objComponenteDistribuidorGenerador
     * @param update
     * @return
     */
    public boolean isIncludedInRepresentationModeloAsociado(ComponenteDistribuidorGenerador objComponenteDistribuidor){
        try{
            for(ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociadoIncluido : devolverColeccionModelosAsociados()){
                ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = 
                        (ComponenteDistribuidorGenerador) objComponenteDistribuidorModeloAsociadoIncluido.getObjComponenteDistribuidorObject();
                if(objComponenteDistribuidor.equals(objComponenteDistribuidorGenerador)){
                    return true;
                }
            }            
        }catch(java.lang.Exception ex){
            UtilRender.printlnConsole("Error en la Busqueda.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
        return false;
    }
    
    /**
     * Actualiza el <code>ComponenteBeans</code> el Posición i de la Colección de <code>ComponenteBeans</code>.
     * @param i Posición en la Colección de <code>ComponenteBeans</code>.
     * @param objComponente <code>ComponenteBeans</code> que se incluirá.
     * @return <code>ComponenteBeans</code> Actualizado.
     */
    public ComponenteBeans set(int i, ComponenteBeans objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesBeans.set(i, objComponente);
        }catch(java.lang.Exception ex){ 
            //
        }
        return null;
    }
    
    /**
     * Actualiza el <code>ComponenteDistribuidorContenedor</code> el Posición i de la Colección de <code>ComponenteDistribuidorContenedor</code>.
     * @param i Posición en la Colección de <code>ComponenteDistribuidorContenedor</code>.
     * @param objComponente <code>ComponenteDistribuidorContenedor</code> que se incluirá.
     * @return <code>ComponenteDistribuidorContenedor</code> Actualizado.
     */
    public ComponenteDistribuidorContenedor set(int i, ComponenteDistribuidorContenedor objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesContenedores.set(i, objComponente);
        }catch(java.lang.Exception ex){ 
            //
        }
        return null;
    }
    
    /**
     * Actualiza el <code>ComponenteDistribuidorIntegrador</code> el Posición i de la Colección de <code>ComponenteDistribuidorContenedor</code>.
     * @param i Posición en la Colección de <code>ComponenteDistribuidorIntegrador</code>.
     * @param objComponente <code>ComponenteDistribuidorIntegrador</code> que se incluirá.
     * @return <code>ComponenteDistribuidorContenedor</code> Actualizado.
     */
    public ComponenteDistribuidorIntegrador set(int i, ComponenteDistribuidorIntegrador objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesIntegradores.set(i, objComponente);
        }catch(java.lang.Exception ex){ 
            //
        }
        return null;
    }
    
    /**
     * Actualiza el <code>ComponenteDistribuidorGenerador</code> el Posición i de la Colección de <code>ComponenteDistribuidorGenerador</code>.
     * @param i Posición en la Colección de <code>ComponenteDistribuidorGenerador</code>.
     * @param objComponente <code>ComponenteDistribuidorGenerador</code> que se incluirá.
     * @return <code>ComponenteDistribuidorGenerador</code> Actualizado.
     */
    public ComponenteDistribuidorGenerador set(int i, ComponenteDistribuidorGenerador objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesGeneradores.set(i, objComponente);
        }catch(java.lang.Exception ex){  
            //
        }
        return null;
    }    
    
    /**
     * Actualiza el <code>ComponenteDistribuidorExtra</code> el Posición i de la Colección de <code>ComponenteDistribuidorExtra</code>.
     * @param i Posición en la Colección de <code>ComponenteDistribuidorExtra</code>.
     * @param objComponente <code>ComponenteDistribuidorExtra</code> que se incluirá.
     * @return <code>ComponenteDistribuidorExtra</code> Actualizado.
     */
    public ComponenteDistribuidorExtra set(int i, ComponenteDistribuidorExtra objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesExtras.set(i, objComponente);
        }catch(java.lang.Exception ex){  
            //
        }
        return null;
    }
    
    /**
     * Actualiza el <code>ComponenteGeneradoSimple</code> el Posición i de la Colección de <code>ComponenteGeneradoSimple</code>.
     * @param i Posición en la Colección de <code>ComponenteGeneradoSimple</code>.
     * @param objComponente <code>ComponenteGeneradoSimple</code> que se incluirá.
     * @return <code>ComponenteGeneradoSimple</code> Actualizado.
     */
    public ComponenteGeneradoSimple set(int i, ComponenteGeneradoSimple objComponente){
        try{
            objComponente.idColeccion = i;
            return this.objComponentesGenerados.set(i, objComponente);
        }catch(java.lang.Exception ex){ 
            //
        }
        return null;
    }
    
    /**
     * Elimina el <code>ComponenteBeans</code> de la Colección de <code>ComponenteBeans</code>.
     * @param objComponente <code>ComponenteBeans</code> que se eliminará de la Colección de <code>ComponenteBeans</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteBeans objComponente){
        return this.objComponentesBeans.remove(objComponente);
    }
    
    /**
     * Elimina el <code>ComponenteDistribuidorContenedor</code> de la Colección de <code>ComponenteDistribuidorContenedor</code>.
     * @param objComponente <code>ComponenteDistribuidorContenedor</code> que se eliminará de la Colección de <code>ComponenteDistribuidorContenedor</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteDistribuidorContenedor objComponente){
        return this.objComponentesContenedores.remove(objComponente);
    }
    
    /**
     * Elimina el <code>ComponenteDistribuidorIntegrador</code> de la Colección de <code>ComponenteDistribuidorIntegrador</code>.
     * @param objComponente <code>ComponenteDistribuidorIntegrador</code> que se eliminará de la Colección de <code>ComponenteDistribuidorIntegrador</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteDistribuidorIntegrador objComponente){
        return this.objComponentesIntegradores.remove(objComponente);
    }
    
    /**
     * Elimina el <code>ComponenteDistribuidorGenerador</code> de la Colección de <code>ComponenteDistribuidorGenerador</code>.
     * @param objComponente <code>ComponenteDistribuidorGenerador</code> que se eliminará de la Colección de <code>ComponenteDistribuidorGenerador</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteDistribuidorGenerador objComponente){
        return this.objComponentesGeneradores.remove(objComponente);
    }
    
    /**
     * Elimina el <code>ComponenteDistribuidorExtra</code> de la Colección de <code>ComponenteDistribuidorExtra</code>.
     * @param objComponente <code>ComponenteDistribuidorExtra</code> que se eliminará de la Colección de <code>ComponenteDistribuidorExtra</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteDistribuidorExtra objComponente){
        return this.objComponentesExtras.remove(objComponente);
    }
    
    /**
     * Elimina el <code>ComponenteGeneradoSimple</code> de la Colección de <code>ComponenteGeneradoSimple</code>.
     * @param objComponente <code>ComponenteGeneradoSimple</code> que se eliminará de la Colección de <code>ComponenteGeneradoSimple</code>
     * @return boolean que determina el resultado del proceso.
     */
    public boolean del(ComponenteGeneradoSimple objComponente){
        return this.objComponentesGenerados.remove(objComponente);
    }
    
    /**
     * Actualiza los id de Generación de Componentes luego de un proceso de
     * carga de archivo.
     */
    public void updateIdSerialComponentes(){   
        
        ComponenteGeneradoSimple.serialIdComponenteGeneradoSimple = lastIndx((ArrayList) this.objComponentesGenerados) + 1;
        ComponenteGeneradoInterno.serialIdComponenteGeneradoInterno = lastIndx((ArrayList) this.objComponentesGenerados) + 1;
        
        ComponenteDistribuidorExtra.serialIdComponenteExtra = lastIndx((ArrayList) this.objComponentesExtras) + 1;        
        
        ComponenteDistribuidorGeneradorUnitario.serialIdComponenteGeneradorUnitario = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorString.serialIdComponenteGeneradorString = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorEnum.serialIdComponenteGeneradorEnum = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorVinculador.serialIdComponenteGeneradorVinculador = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorMetodoSetter.serialIdComponenteGeneradorMetodoSetter = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        ComponenteDistribuidorGeneradorClaseCompleja.serialIdComponenteGeneradorClaseCompleja = lastIndx((ArrayList) this.objComponentesGeneradores) + 1;
        
        ComponenteDistribuidorIntegradorMetodo.serialIdComponenteIntegradorMetodo = lastIndx((ArrayList) this.objComponentesIntegradores) + 1;
        ComponenteDistribuidorIntegradorSimple.serialIdComponenteIntegradorSimple = lastIndx((ArrayList) this.objComponentesIntegradores) + 1;
        ComponenteDistribuidorIntegradorExtra.serialIdComponenteIntegradorExtra = lastIndx((ArrayList) this.objComponentesIntegradores) + 1;
        
        ComponenteDistribuidorContenedorLibre.serialIdComponenteContenedorAsistenteLibre = lastIndx((ArrayList) this.objComponentesContenedores) + 1;
        ComponenteDistribuidorContenedorEspejo.serialIdComponenteContenedorAsistenteEspejo = lastIndx((ArrayList) this.objComponentesContenedores) + 1;
    }
    
    private int lastIndx(ArrayList<Componente> objComponentes){
        if(objComponentes.size() > 0){
            int idComponente = objComponentes.size() - 1;
            Componente objComponente = objComponentes.get(idComponente);
            if(objComponente instanceof ComponenteGeneradoSimple){
                ComponenteGeneradoSimple objComponenteGeneradoSimple = (ComponenteGeneradoSimple) objComponente;
                return objComponenteGeneradoSimple.getIdClaseComponenteGeneradoSimple();
            }            
            else if(objComponente instanceof ComponenteGeneradoInterno){
                ComponenteGeneradoInterno objComponenteGeneradoInterno = (ComponenteGeneradoInterno) objComponente;
                return objComponenteGeneradoInterno.getIdClaseComponenteGeneradoInterno();
            }
            else if(objComponente instanceof ComponenteDistribuidorExtra){
                ComponenteDistribuidorExtra objComponenteDistribuidorExtra = (ComponenteDistribuidorExtra) objComponente;
                return objComponenteDistribuidorExtra.getIdClaseComponenteExtra();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){
                ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponente;
                return objComponenteGeneradorUnitario.getIdClaseComponenteGeneradorUnitario();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorString){
                ComponenteDistribuidorGeneradorString objComponenteGeneradorString = (ComponenteDistribuidorGeneradorString) objComponente;
                return objComponenteGeneradorString.getIdClaseComponenteGeneradorString();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorEnum){
                ComponenteDistribuidorGeneradorEnum objComponenteGeneradorEnum = (ComponenteDistribuidorGeneradorEnum) objComponente;
                return objComponenteGeneradorEnum.getIdClaseComponenteGeneradorEnum();
            }            
            else if(objComponente instanceof ComponenteDistribuidorGeneradorVinculador){
                ComponenteDistribuidorGeneradorVinculador objComponenteGeneradorVinculador = (ComponenteDistribuidorGeneradorVinculador) objComponente;
                return objComponenteGeneradorVinculador.getIdClaseComponenteGeneradorVinculador();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoSetter){
                ComponenteDistribuidorGeneradorMetodoSetter objComponenteGeneradorMetodo = (ComponenteDistribuidorGeneradorMetodoSetter) objComponente;
                return objComponenteGeneradorMetodo.getIdClaseComponenteGeneradorMetodoSetter();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorMetodoGetter){
                ComponenteDistribuidorGeneradorMetodoGetter objComponenteGeneradorMetodo = (ComponenteDistribuidorGeneradorMetodoGetter) objComponente;
                return objComponenteGeneradorMetodo.getIdClaseComponenteGeneradorMetodoGetter();
            }
            else if(objComponente instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                ComponenteDistribuidorGeneradorClaseCompleja objComponenteGeneradorClase = (ComponenteDistribuidorGeneradorClaseCompleja) objComponente;
                return objComponenteGeneradorClase.getIdClaseComponenteGeneradorClaseCompleja();
            }        
            else if(objComponente instanceof ComponenteDistribuidorIntegradorMetodo){
                ComponenteDistribuidorIntegradorMetodo objComponenteIntegradorMetodo = (ComponenteDistribuidorIntegradorMetodo) objComponente;
                return objComponenteIntegradorMetodo.getIdClaseComponenteIntegradorMetodo();
            } 
            else if(objComponente instanceof ComponenteDistribuidorIntegradorSimple){
                ComponenteDistribuidorIntegradorSimple objComponenteIntegradorSimple = (ComponenteDistribuidorIntegradorSimple) objComponente;
                return objComponenteIntegradorSimple.getIdClaseComponenteIntegradorSimple();
            }
            else if(objComponente instanceof ComponenteDistribuidorIntegradorExtra){
                ComponenteDistribuidorIntegradorExtra objComponenteIntgradorExtra = (ComponenteDistribuidorIntegradorExtra) objComponente;
                return objComponenteIntgradorExtra.getIdClaseComponenteIntegradorExtra();
            }
            else if(objComponente instanceof ComponenteDistribuidorContenedorLibre){
                ComponenteDistribuidorContenedorLibre objComponenteContenedorAsistenteLibre = (ComponenteDistribuidorContenedorLibre) objComponente;
                return objComponenteContenedorAsistenteLibre.getIdClaseComponenteContenedorAsistenteLibre();
            }
            else if(objComponente instanceof ComponenteDistribuidorContenedorEspejo){
                ComponenteDistribuidorContenedorEspejo objComponenteContenedorAsistenteEspejo = (ComponenteDistribuidorContenedorEspejo) objComponente;
                return objComponenteContenedorAsistenteEspejo.getIdClaseComponenteContenedorAsistenteEspejo();
            }            
        }
        return 0;
    }
    
    /**
     * Devuelve el Primer <code>ComponenteBeans</code> que corresponda al <code>ComponenteDistribuidor</code>.
     * @param objComponenteDistribuidor <code>ComponenteDistribuidor</code> por el cual se buscará el <code>ComponenteBeans</code>.
     * @return <code>ComponenteBeans</code> que corresponde al <code>ComponenteDistribuidor</code> ó <code>null</code> en caso de
     * no encontrarse o si existe algún error en la busqueda.
     */
    public ComponenteBeans buscarComponenteBeans(ComponenteDistribuidor objComponenteDistribuidor){
        for(ComponenteBeans objComponenteBeans : this.objComponentesBeans){            
            ComponenteDistribuidor objComponenteDistribuidorContenido = objComponenteBeans.getObjComponenteDistribuidor();
            if(objComponenteDistribuidorContenido.getName().equals(objComponenteDistribuidor.getName())){
                return objComponenteBeans;
            }
        }
        return null;
    }
    
    /**
     * Devuelve el Primer <code>ComponenteDistribuidorGenerador</code> que corresponda al <code>ObjetoTipoDatoReflexion</code>.
     * @param objTipoDatoModeloAnalizado <code>ObjetoTipoDatoReflexion</code> por el cual se buscará el <code>ComponenteDistribuidorGenerador</code>.
     * @return <code>ComponenteDistribuidorGenerador</code> que corresponde al <code>ObjetoTipoDatoReflexion</code> ó <code>null</code> en caso de
     * no encontrarse o si existe algún error en la busqueda.
     */
    public ComponenteDistribuidorGenerador buscarComponenteGeneradorPorTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
            ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
            if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                //evaluar si es una coleccion y si aplica para el control (solo los unitarios)
                if(objTipoDatoModeloAnalizado.esColeccion() && objComponenteGenerador instanceof ComponenteDistribuidorGeneradorUnitario){
                    ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteGenerador;
                    //evaluar si el tipo de coleccion de los objetos es compatible
                    if(GeneradorComponentes.devolverTipoColeccionModeloAsociado(objTipoDatoModeloAnalizado.getObjClass()) == 
                            GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteDistribuidorGeneradorUnitario.getObjComponenteGenerador().getObjClassSwing())){
                        ObjetoTipoDatoReflexion objTipoDatoGenericoColeccion = objTipoDatoModeloAnalizado.getObjTiposGenericos().get(0);
                        //evaluar si tiene un modelo asociado agregado
                        if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidorGeneradorUnitario)){
                            ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado().getObjComponenteDistribuidorModeloAsociado();
                            ComponenteDistribuidor objComponenteDistribuidor = objComponenteDistribuidorModeloAsociado.getObjComponenteDistribuidorObject();
                            //evaluar si es un generador
                            if(objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
                                ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidor;
                                ObjetoTipoDatoReflexion objTipoDatoGenericoColeccionObject = objComponenteDistribuidorGenerador.getObjTipoDato();
                                //se evaluan los classpath
                                if(objTipoDatoGenericoColeccion.getStrClassPath().equals(objTipoDatoGenericoColeccionObject.getStrClassPath())){
                                    return objComponenteGenerador;
                                }
                            }
                        }
                    }
                }
                else if(objTipoDatoModeloAnalizado.contieneRepresentacionesGenericas()){
                    
                }
                else{
                    return objComponenteGenerador;
                }
            }
        }
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones del Tipo de Dato Analizado
     * que existen en la Biblioteca de Trabajo Actual.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se devolverá la Colección.
     * @return Colección de Componentes Generadores que Representan el Tipo de Dato recibido.
     */
    public ArrayList<ComponenteDistribuidorGenerador> devolverColeccionRepresentacionesTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            ArrayList<ComponenteDistribuidorGenerador> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGenerador>();
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                    objColeccionRepresentaciones.add(objComponenteGenerador);
                }
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones del Tipo de Dato Analizado
     * que existen en la Biblioteca de Trabajo Actual.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se devolverá la Colección.
     * @return Colección de Componentes Generadores que Representan el Tipo de Dato recibido.
     */
    public ArrayList<ComponenteDistribuidorGenerador> devolverColeccionRepresentacionesTipoDatoEntrada(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            ArrayList<ComponenteDistribuidorGenerador> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGenerador>();
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())
                        && !(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorString)){
                    objColeccionRepresentaciones.add(objComponenteGenerador);
                }
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones del Tipo de Dato Analizado
     * que existen en la Biblioteca de Trabajo Actual.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se devolverá la Colección.
     * @param eTipo 
     * @return Colección de Componentes Generadores que Representan el Tipo de Dato recibido.
     */
    public ArrayList<ComponenteDistribuidorGenerador> devolverColeccionRepresentacionesTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado, TipoGeneracionClaseCompleja eTipo){
       try{
            ArrayList<ComponenteDistribuidorGenerador> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGenerador>();
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                    if(eTipo == TipoGeneracionClaseCompleja.eEntrada && !(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorString)){
                        objColeccionRepresentaciones.add(objComponenteGenerador);
                    }
                    else if(eTipo == TipoGeneracionClaseCompleja.eSalida && !(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorVinculador)){
                        objColeccionRepresentaciones.add(objComponenteGenerador);
                    }
                }
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones simplificadas del Tipo de Dato Analizado
     * que existen en la Biblioteca de Trabajo Actual.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se devolverá la Colección.
     * @return Colección de Componentes Generadores que Representan el Tipo de Dato recibido.
     */
    public ArrayList<ComponenteDistribuidorGenerador> devolverColeccionRepresentacionesSimplificadasTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            ArrayList<ComponenteDistribuidorGenerador> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGenerador>();
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath()) &&
                        objComponenteGenerador instanceof ComponenteDistribuidorGeneradorString){
                    objColeccionRepresentaciones.add(objComponenteGenerador);
                }
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones vinculadas del Tipo de Dato Analizado
     * que existen en la Biblioteca de Trabajo Actual.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se devolverá la Colección.
     * @return Colección de Componentes Generadores que Representan el Tipo de Dato recibido.
     */
    public ArrayList<ComponenteDistribuidorGenerador> devolverColeccionRepresentacionesVinculadasTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            ArrayList<ComponenteDistribuidorGenerador> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGenerador>();
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath()) &&
                        objComponenteGenerador instanceof ComponenteDistribuidorGeneradorVinculador){
                    objColeccionRepresentaciones.add(objComponenteGenerador);
                }
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones de Clases
     * que existen en la Biblioteca de Trabajo Actual.
     * @return Colección de Componentes Generadores que Representan las Clases.
     */
    public ArrayList<ComponenteDistribuidorGeneradorClaseCompleja> devolverColeccionRepresentacionesClase(){
        try{
            ArrayList<ComponenteDistribuidorGeneradorClaseCompleja> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorGeneradorClaseCompleja>();
            try{
                for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){            
                    if(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                        objColeccionRepresentaciones.add((ComponenteDistribuidorGeneradorClaseCompleja)objComponenteGenerador);
                    }
                }
            }catch(java.lang.Exception ex){}
            return objColeccionRepresentaciones;
     }catch(java.lang.NullPointerException ex){
     }
        return null;
    }
    
    /**
     * Devuelve una Colección que contiene todas las representaciones de Modelos Asociados
     * que existen en la Biblioteca de Trabajo Actual.     
     * @return Colección de Modelos Asocaidos.
     */
    public ArrayList<ComponenteDistribuidorModeloAsociado> devolverColeccionModelosAsociados(){
        try{
            ArrayList<ComponenteDistribuidorModeloAsociado> objColeccionRepresentaciones = new ArrayList<ComponenteDistribuidorModeloAsociado>();
            try{
                //--------------------------------------------------------------
                //Primera fase se buscan los modelos asociados a generadores 
                //en representaciones incluidas en integradores
                //--------------------------------------------------------------
                for(ComponenteDistribuidorIntegrador objComponenteIntegrador : this.objComponentesIntegradores){            
                    for(Componente objComponente : objComponenteIntegrador.getComponentesDistribuidos()){            
                        if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){
                            ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponente;
                            if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidorGeneradorUnitario)){
                                ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado().getObjComponenteDistribuidorModeloAsociado();
                                if(!objColeccionRepresentaciones.contains(objComponenteDistribuidorModeloAsociado)){
                                    objColeccionRepresentaciones.add(objComponenteDistribuidorModeloAsociado);
                                }
                            }
                        }
                    }
                }
                //--------------------------------------------------------------
                //se buscan los modelos asociados a los generadores
                //esta fase se divide en dos partes
                //1. buscar modelos asociados en propiedades de clases.
                //2. buscar modelos asociados en generadores independientes
                //--------------------------------------------------------------
                for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){            
                    if(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorClaseCompleja){
                        ComponenteDistribuidorGeneradorClaseCompleja objComponenteDistribuidorGeneradorClaseCompleja = (ComponenteDistribuidorGeneradorClaseCompleja) objComponenteGenerador;
                        for(Componente objComponente : objComponenteDistribuidorGeneradorClaseCompleja.getComponentesDistribuidos()){            
                            if(objComponente instanceof ComponenteDistribuidorGeneradorUnitario){
                                ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponente;
                                if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidorGeneradorUnitario)){
                                    ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado().getObjComponenteDistribuidorModeloAsociado();
                                    if(!objColeccionRepresentaciones.contains(objComponenteDistribuidorModeloAsociado)){
                                        objColeccionRepresentaciones.add(objComponenteDistribuidorModeloAsociado);
                                    }
                                }
                            }
                        }
                    }
                    else if(objComponenteGenerador instanceof ComponenteDistribuidorGeneradorUnitario){
                        ComponenteDistribuidorGeneradorUnitario objComponenteDistribuidorGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteGenerador;
                        if(UtilRepresentacion.tieneModeloAsociadoAsignado(objComponenteDistribuidorGeneradorUnitario)){
                            ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado = objComponenteDistribuidorGeneradorUnitario.getObjModeloAsociado().getObjComponenteDistribuidorModeloAsociado();
                            if(!objColeccionRepresentaciones.contains(objComponenteDistribuidorModeloAsociado)){
                                objColeccionRepresentaciones.add(objComponenteDistribuidorModeloAsociado);
                            }
                        }
                    }
                }                
            }catch(java.lang.Exception ex){
                UtilRender.printlnConsole("Error al Devolver los Modelos Asociados.", ex.getMessage(), UtilRender.ACTION_ERROR);
            }
            return objColeccionRepresentaciones;
        }catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole("Error Objeto Nulo.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
        return null;
    }
    
    /**
     * Devuelve el Primer <code>ComponenteDistribuidorGenerador</code> que corresponda al <code>ObjetoTipoDatoReflexion</code>.
     * @param objTipoDatoModeloAnalizado <code>ObjetoTipoDatoReflexion</code> por el cual se buscará el <code>ComponenteDistribuidorGenerador</code>.
     * @param modo 
     * @return <code>ComponenteDistribuidorGenerador</code> que corresponde al <code>ObjetoTipoDatoReflexion</code> ó <code>null</code> en caso de
     * no encontrarse o si existe algún error en la busqueda.
     */
    public ComponenteDistribuidorGenerador buscarComponenteGeneradorModoOperacion(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado, int modo){
        try{
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                    return objComponenteGenerador;                
                }
            }
            return null;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }
    
    /**
     * Devuelve el Primer <code>ComponenteDistribuidorGenerador</code> que corresponda al <code>ObjetoTipoDatoReflexion</code>.
     * @param objClass 
     * @param modo 
     * @return <code>ComponenteDistribuidorGenerador</code> que corresponde al <code>ObjetoTipoDatoReflexion</code> ó <code>null</code> en caso de
     * no encontrarse o si existe algún error en la busqueda.
     */
    public ComponenteDistribuidorGenerador buscarComponenteGeneradorClassModoOperacion(Class objClass, int modo){
        try{
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objClass.getCanonicalName())){
                    return objComponenteGenerador;                
                }
            }
            return null;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }   
    
    /**
     * Evalua si existe en la Biblioteca de Trabajo actual al menos un representación para el Tipo
     * de dato recibido.
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se buscará al menos una Representación.
     * @return Boolean que determina si existe actualmente al menos una representación en la Biblioteca de Trabajo.
     */
    public boolean existeRepresentacionTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                    return true;
                }
            }
            return false;
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Evalua si existe en la Biblioteca de Trabajo actual al menos un representación para el Tipo
     * de dato recibido y sus Tipos genericos(Si los incluye).
     * @param objTipoDatoModeloAnalizado Tipo de Dato por el cual se buscará al menos una Representación.
     * @return Boolean que determina si existe actualmente al menos una representación en la Biblioteca de Trabajo para
     * el Tipo de Dato y sus Tipos Genericos.
     */
    public boolean existeFullRepresentacionTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            if(existeRepresentacionTipoDato(objTipoDatoModeloAnalizado)){
                if(objTipoDatoModeloAnalizado.getObjTiposGenericos() != null){
                    for(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizadoGenerico : objTipoDatoModeloAnalizado.getObjTiposGenericos()){
                        if(!existeRepresentacionTipoDato(objTipoDatoModeloAnalizadoGenerico)){
                            return false;
                        }
                    }
                }
                return true;
            }        
            }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Evalua si existe en la Biblioteca de Trabajo actual al menos un representación para los Tipos
     * de dato recibidos.
     * @param objTiposDatoGenericos Tipos de Dato por el cual se buscará al menos una Representación.
     * @return Boolean que determina si existe actualmente al menos una representación en la Biblioteca de Trabajo para
     * el Tipo de Dato y sus Tipos Genericos.
     */
    public boolean existeRepresentacionTiposDatoGenericos(ArrayList<ObjetoTipoDatoReflexion> objTiposDatoGenericos){
        try{
            for(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizadoGenerico : objTiposDatoGenericos){
                if(!existeRepresentacionTipoDato(objTipoDatoModeloAnalizadoGenerico)){
                    return false;
                }
            }            
        }catch(java.lang.NullPointerException ex){            
        }
        return true;
    }
    
    /**
     * Evuala si existe
     * @param objTipoDatoModeloAnalizado 
     * @DefinicionParametro
     * @return @DefinicionReturn
     */
    public boolean existeComponenteGeneradorPorTipoDato(ObjetoTipoDatoReflexion objTipoDatoModeloAnalizado){
        try{
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente == null){
                    if(objComponenteGenerador.getStrClassPathTipoDato().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                        return true;                    
                    }
                }
                else{
                    if(objTipoDatoInComponente.getStrClassPath().equals(objTipoDatoModeloAnalizado.getStrClassPath())){
                        return true;                
                    }
                }
            }
            return false;
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * @param objComponenteDistribuidor 
     * @DefinicionMetodo
@DefinicionParametro
     * @return @DefinicionReturn
     */
    public boolean existeComponenteBeansPorCD(ComponenteDistribuidor objComponenteDistribuidor){
        try{
            for(ComponenteBeans objComponenteBeans : this.objComponentesBeans){            
                ComponenteDistribuidor objComponenteDistribuidorContenido = objComponenteBeans.getObjComponenteDistribuidor();
                if(objComponenteDistribuidorContenido.getName().equals(objComponenteDistribuidor.getName())){
                    return true;
                }
            }        
            return false;
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * @DefinicionMetodo
     * @param objClass @DefinicionParametro
     * @return @DefinicionReturn
     */
    public boolean existeComponenteGeneradorPorClass(Class objClass){
        try{
            for(ComponenteDistribuidorGenerador objComponenteGenerador : this.objComponentesGeneradores){
                ObjetoTipoDatoReflexion objTipoDatoInComponente = objComponenteGenerador.getObjTipoDato();
                if(objTipoDatoInComponente.getStrClassPath().equals(objClass.getCanonicalName())){
                    return true;
                }
            }
            return false;
     } catch(java.lang.NullPointerException ex){}
        return false;
    }   

    /**
     * Devuelve el <code>TipoBiblioteca</code> de la <code>BibliotecaTrabajo</code> actual.
     * @return <code>TipoBiblioteca</code> de la <code>BibliotecaTrabajo</code> actual.
     */
    public TipoBiblioteca geteBiblioteca() {
        return eBiblioteca;
    }

    /**
     * 
     * @return
     */
    public PaqueteClass getObjPaqueteRoot() {
        return objPaqueteRoot;
    }

    /**
     * 
     * @param objPaqueteRoot
     */
    public void setObjPaqueteRoot(PaqueteClass objPaqueteRoot) {
        this.objPaqueteRoot = objPaqueteRoot;
    }
    
    /**
     * 
     * @param objComponente
     * @return
     */
    public boolean actualizarComponente(Componente objComponente){
        try{
            if(objComponente instanceof ComponenteDistribuidorGenerador){
                ComponenteDistribuidorGenerador objComponenteGenerador = (ComponenteDistribuidorGenerador) objComponente;
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(objComponenteGenerador)){
                    int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(objComponenteGenerador);
                    UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, objComponenteGenerador);            
                    return true;
                }
            }         
            else if(objComponente instanceof ComponenteDistribuidorIntegrador){
                ComponenteDistribuidorIntegrador objComponenteIntegrador = (ComponenteDistribuidorIntegrador) objComponente;
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().contains(objComponenteIntegrador)){
                    int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesIntegradores().indexOf(objComponenteIntegrador);
                    UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, objComponenteIntegrador);            
                    return true;
                }
            }
            else if(objComponente instanceof ComponenteDistribuidorContenedor){
                ComponenteDistribuidorContenedor objComponenteContenedor = (ComponenteDistribuidorContenedor) objComponente;
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().contains(objComponenteContenedor)){
                    int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesContenedores().indexOf(objComponenteContenedor);
                    UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, objComponenteContenedor);            
                    return true;
                }
            }
        }catch(java.lang.Exception ex){            
        }    
        return false;
    }
    
    /**
     * 
     * @param objComponente
     * @return
     */
    public boolean agregarComponente(Componente objComponente){
        try{
            if(objComponente instanceof ComponenteDistribuidorGenerador){
                ComponenteDistribuidorGenerador objComponenteGenerador = (ComponenteDistribuidorGenerador) objComponente;
                //if(UtilRepresentacion.objBibliotecaTrabajoLocal.addSourceCode(objComponenteGenerador)){                                        
                if(add(objComponenteGenerador)){                                        
                    return true;                                   
                }                
            }            
        }catch(java.lang.Exception ex){            
        }
        return false;
    }
    
    /**
     * 
     * @param objComponenteDistribuidorModeloAsociado
     * @param objComponenteDistribuidorGenerador
     * @param update
     * @return
     */
    public boolean actualizarModeloAsociado(ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociado, ComponenteDistribuidorGenerador objComponenteDistribuidorGenerador, int update){
        try{
            for(ComponenteDistribuidorModeloAsociado objComponenteDistribuidorModeloAsociadoIncluido : devolverColeccionModelosAsociados()){
                if(objComponenteDistribuidorModeloAsociadoIncluido.equals(objComponenteDistribuidorModeloAsociado)){
                    if(update == ComponenteDistribuidorModeloAsociado.COMPONENTE_DISTRIBUIDOR_OBJECT){
                        objComponenteDistribuidorModeloAsociadoIncluido.setObjComponenteDistribuidorObject(objComponenteDistribuidorGenerador);
                    }                
                }
            }
            return false;
        }catch(java.lang.NullPointerException ex){}
        return false;
    }

    /**
     * Devuelve el Estado de la Lista de Espera.
     * @return Estado de la Lista de Espera.
     */
    public boolean isListaEspera() {
        return listaEspera;
    }

    /**
     * Establece el Estado de la Lista de Espera.
     * @param listaEspera boolean que determina el Estado de la Lista de Espera.
     */
    public void setListaEspera(boolean listaEspera) {
        this.listaEspera = listaEspera;
    }

    /**
     * Devuelve la Colección de Modelo estáticos agregados a la Biblioteca de Trabajo.
     * @return
     */
    public HashMap<String, StaticListModelObject> getObjStaticListModelString() {
        return objStaticListModelString;
    }
    
    /**
     * Agrega un nuevo modelo estático a la colección de modelos de la Biblioteca de Trabajo.
     * @param name Nombre del nuevo modelo.
     * @param objListModelString Referencia del Nuevo modelo.
     * @return Referencia del Nuevo modelo.
     */
    public StaticListModelObject addStaticListModelString(String name, StaticListModelObject objListModelString){
        return objStaticListModelString.put(name, objListModelString);
    }

    /**
     * Devuelve la Colección de notificaciones del modelo analizado.
     * @return Colección de notificaciones del modelo analizado.
     */
    public ArrayList<String> getObjNotificacionesModeloAnalizado() {
        return objNotificacionesModeloAnalizado;
    }
    
    /**
     * Agrega una Notificación a la Colección de notificaciones de la Biblioteca de Trabajo.
     * @param strNotificacion Nueva Notificación.
     * @return boolean que determina el estado de la Inclusión de la Notificación.
     */
    public boolean addNotificacionModeloAnalizado(String strNotificacion){
        return objNotificacionesModeloAnalizado.add(strNotificacion);
    }
    
    @Override
    public int compareTo(Object o) {
        try{
            BibliotecaTrabajo obj = (BibliotecaTrabajo) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        } catch(java.lang.NullPointerException ex){}
        return 0;
    }
    
    /**
     * Evalua si existe la Representación en la Biblioteca.
     * @param objComponente Componente.
     * @return devuelve el estado de la evaluación.
     */
    public boolean contieneComponente(ComponenteGeneradoSimple objComponente){
        return objComponentesGenerados.contains(objComponente);
    }
    
    /**
     * Evalua si existe la Representación en la Biblioteca.
     * @param objComponente Componente.
     * @return devuelve el estado de la evaluación.
     */
    public boolean contieneComponente(ComponenteDistribuidorGenerador objComponente){
        return objComponentesGeneradores.contains(objComponente);
    }
    
    /**
     * Evalua si existe la Representación en la Biblioteca.
     * @param objComponente Componente.
     * @return devuelve el estado de la evaluación.
     */
    public boolean contieneComponente(ComponenteDistribuidorIntegrador objComponente){
        return objComponentesIntegradores.contains(objComponente);
    }
    
    /**
     * Evalua si existe la Representación en la Biblioteca.
     * @param objComponente Componente.
     * @return devuelve el estado de la evaluación.
     */
    public boolean contieneComponente(ComponenteDistribuidorContenedor objComponente){
        return objComponentesContenedores.contains(objComponente);
    }
    
    public boolean existsResourcesImage(){
        for(ComponenteDistribuidorContenedor objComponenteContenedor : objComponentesContenedores){
            if(existsResourcesImage((ComponenteDistribuidorContenedor)objComponenteContenedor)){
                return true;
            }
        }
        for(ComponenteDistribuidorIntegrador objComponenteIntegrador : objComponentesIntegradores){
            if(existsResourcesImage((ComponenteDistribuidorIntegrador)objComponenteIntegrador)){
                return true;
            }
        }
        for(ComponenteDistribuidorGenerador objComponenteGenerador : objComponentesGeneradores){
            if(existsResourcesImage((ComponenteDistribuidorGenerador)objComponenteGenerador)){
                return true;
            }
        }
        return false;
    }
    
    private boolean existsResourcesImage(ComponenteDistribuidorContenedor objComponenteContenedor){
        for(Componente objComponenteIntegrador : objComponenteContenedor.getComponentesDistribuidos()){
            if(existsResourcesImage((ComponenteDistribuidorIntegrador)objComponenteIntegrador)){
                return true;
            }
        }
        return false;
    }
    
    private boolean existsResourcesImage(ComponenteDistribuidorIntegrador objComponenteIntegrador){
        for(Componente objComponenteGenerador : objComponenteIntegrador.getComponentesDistribuidos()){
            if(existsResourcesImage((ComponenteDistribuidorGenerador)objComponenteGenerador)){
                return true;
            }
        }
        return false;
    }
    
    private boolean existsResourcesImage(ComponenteDistribuidorGenerador objComponenteGenerador){
        for(Componente objComponente : objComponenteGenerador.getComponentesDistribuidos()){
            if(objComponente instanceof ComponenteGenerado){
                ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;
                if(objComponenteGenerado.existsResourceImage()){
                    return true;
                }
            }            
        }
        return false;
    }
    
    public ArrayList<ComponenteGenerado> getComponentesWithResourceImage(){
        ArrayList<ComponenteGenerado> objComponentes = new ArrayList<ComponenteGenerado>();
        for(ComponenteDistribuidorContenedor objComponente : objComponentesContenedores){
            getComponentesWithResourceImage(objComponentes, objComponente);
        }
        for(ComponenteDistribuidorIntegrador objComponente : objComponentesIntegradores){
            getComponentesWithResourceImage(objComponentes, objComponente);
        }
        for(ComponenteDistribuidorGenerador objComponente : objComponentesGeneradores){
            getComponentesWithResourceImage(objComponentes, objComponente);
        }
        return objComponentes;
    }
    
    private void getComponentesWithResourceImage(ArrayList<ComponenteGenerado> objComponentes, ComponenteDistribuidorContenedor objComponenteContenedor){
        try{
            for(Componente objComponente : objComponenteContenedor.getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteDistribuidorIntegrador){
                    getComponentesWithResourceImage(objComponentes, (ComponenteDistribuidorIntegrador) objComponente);                    
                }            
            }
        }catch(java.lang.Exception ex){
            UtilRender.printlnConsole("Error al Encapsular Recursos.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
    }
    
    private void getComponentesWithResourceImage(ArrayList<ComponenteGenerado> objComponentes, ComponenteDistribuidorIntegrador objComponenteIntegrador){        
        try{
            for(Componente objComponente : objComponenteIntegrador.getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteDistribuidorGenerador){
                    getComponentesWithResourceImage(objComponentes, (ComponenteDistribuidorGenerador) objComponente);                    
                }            
            }
        }catch(java.lang.Exception ex){
            UtilRender.printlnConsole("Error al Encapsular Recursos.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
    }
    
    private void getComponentesWithResourceImage(ArrayList<ComponenteGenerado> objComponentes, ComponenteDistribuidorGenerador objComponenteGenerador){        
        try{
            for(Componente objComponente : objComponenteGenerador.getComponentesDistribuidos()){
                if(objComponente instanceof ComponenteGenerado){
                    ComponenteGenerado objComponenteGenerado = (ComponenteGenerado) objComponente;
                    if(objComponenteGenerado.existsResourceImage()){
                        if(!objComponentes.contains(objComponenteGenerado)){
                            objComponentes.add(objComponenteGenerado);
                        }
                    }
                }            
            }
        }catch(java.lang.Exception ex){
            UtilRender.printlnConsole("Error al Encapsular Recursos.", ex.getMessage(), UtilRender.ACTION_ERROR);
        }
    }
}
